#ifndef CREATURE_HPP
#define CREATURE_HPP
#include "collidable_obj.hpp"
#include "curse_sheet.hpp"
#include "calc_system.hpp"
#include "weapon.hpp"
#include "armor.hpp"
#include "worldmodel.hpp"
#include <string>
using namespace std;

enum class DmgState;

using WeaponList = vector<Weapon*>;

/* 
 * @brief 生物的各种属性
 */
struct CreatureProperties{
    int hp_;    /** 生命值 */
    int mp_;    /** 魔力值 */
    int attack_;    /** 攻击程度（命中率）*/
    int defence_;   /** 防御力 */
    int hungry_;    /** 饥饿度 */
    int speed_;     /** 速度 */
    
    //下面是四维
    int strength_;  /** 力量 */
    int dex_;       /** 敏捷 */
    int intelli_;   /** 智力 */
    int power_;     /** 体力 */
    float burden_;   /** 负重 */
    /*
     * @brief 设置所有属性的函数
     */
    void Set(int hp, int mp, int att, int def, int hungry, int speed, int strength, int dex, int intelli, int power, float burden);
};

/*
 * @brief 所有生物都需要集成的类
 */
class Creature : public CollidableObj{
public:
    Creature(Names name);

    /* @brief 生物的攻击
     * @params target 要攻击的目标*/
    void Attack(Object* target);

    /* @breif 生物的攻击
     * @params relate_x 相对于creature的x距离
     *          relate_y 相对于creature的y距离*/
    void Attack(int relate_x, int relate_y);

    /* @brief 发射物品
     * @params x 要发射到的x坐标
     *          y 要发射到的y坐标*/
    void Fire(int x, int y); //TODO not finish

    /* @brief 查看地形，会将查看到的东西从diary输出*/
    void Look(int x, int y);
    
    /* @brief 带有碰撞检测的移动，移动后会进行一次碰撞检测*/
    void MoveWithColliTest(int relate_x, int relate_y);

    ~Creature() = default;

    CreatureProperties properties_;
    WeaponList weapons_;
private:
    void applyAttack(Creature* other, int dmg, DmgState state);
};

extern Creature* player;

#endif
